#_*_coding:utf-8_*_
#@author:侯松林

'''
1. 以Lena为原始图像，通过OpenCV实现平均滤波，高斯滤波及中值滤波，比较滤波结果。
'''
import numpy as np
import cv2

def noise(img,snr):
    """
    椒盐噪声
    :param img:
    :param snr:
    :return:
    """
    h=img.shape[0]
    w=img.shape[1]
    img1=img.copy()
    sp=h*w   # 计算图像像素点个数
    NP=int(sp*(1-snr))   # 计算图像椒盐噪声点个数
    for i in range (NP):
        randx=np.random.randint(1,h-1)   # 生成一个 1 至 h-1 之间的随机整数
        randy=np.random.randint(1,w-1)   # 生成一个 1 至 w-1 之间的随机整数
        if np.random.random()<=0.5:   # np.random.random()生成一个 0 至 1 之间的浮点数
            img1[randx,randy]=0
        else:
            img1[randx,randy]=255
    return img1

# 读取图像
imgSrc = cv2.imread(r'lena.jpg')
cv2.imshow("imgSrc",imgSrc)

# 转化为灰度图像
img_gray = cv2.cvtColor(imgSrc,cv2.COLOR_BGR2GRAY)
cv2.imshow("img_gray",img_gray)

# 均值滤波
img_mean = cv2.blur(img_gray, (3,3))
cv2.imshow("img_mean",img_mean)

# 高斯滤波
img_Guassian = cv2.GaussianBlur(img_gray,(3,3),0)
cv2.imshow("img_Guassian",img_Guassian)

# 中值滤波
img_median = cv2.medianBlur(img_gray, 3)
cv2.imshow("img_median",img_median)

#加椒盐噪声
noiseImg=noise(img_gray,0.98)
cv2.imshow("noiseimage",noiseImg)

# 椒盐噪声后中值滤波
noiseImg_median = cv2.medianBlur(noiseImg, 3)
cv2.imshow("noiseImg_median",noiseImg_median)

'''
结论：
均值滤波，滤波后，整张图像边缘细节信息被平滑掉，整张图像看起来没有原图像清晰。
高斯滤波，滤波后，虽然图像整体清晰度稍微比原始图像差，但比均值滤波图像清晰，相关细节方面更好地保留下来。
中值滤波，滤波后，与均值滤波差不多，肉眼看不出太多的差距。若对图像加椒盐噪声，中值滤波可以很好地去除椒盐噪声。
'''

cv2.waitKey()
cv2.destroyAllWindows()